输入

  标准库为输入提供了 istream。与 ostream 一样,istream 能处理内部数据类型的字符序列表示。它也很容易扩充,以便去应付各种用户定义类型。

  运算符 >> (“取入”)被用做输入运算符;cin 是标准输入流。>> 右边运算对象的类型决定了可以接受什么输入,这个运算对象被作为输入操作的目标。例如,

    void f()
    {
        int i;
        cin >> i;    // 把一个整数读到i

        double d;
        cin >> d;    // 把一个双精度浮点数读到d
    }

从标准输入读一个数,例如 1234,放入整型变量 i;再读一个浮点数,例如 12.34e5,并将它放入双精度浮点变量 d

  这里是一个例子,它执行从英寸到厘米以及从厘米到英寸的转换。你输入一个数,后面跟着一个表明单位(厘米或英寸)的字符,这个程序就会按照另一种单位输出对应的值。

    int main()
    {
        const float factor = 2.54;    // 1英寸等于2.54厘米
        float x, in, cm;
        char ch = 0;

        cout << "enter length: ";
        cin >> x;     // 读入一个浮点数
        cin >> ch;    // 读入后缀

        switch(ch)
        {
        case 'i':
            in = x;
            cm = x * factor;
            break;
        case 'c':
            in = x/factor;
            cm = x;
            break;
        default:
            in = cm = 0;
            break;
        }
        cout << in << " in = " << cm << " cm\n";
    }

这里的 switch 语句相当于一组常量去检查一个值。break 语句用于跳出 switch 语句。各个分情况常量必须互不相同,default 是可选的,程序员也不一定要提供 default

  我们经常需要输入一系列字符。完成这件事的一个很方便的方式就是将它们读入一个 string 里。例如,

    int main()
    {
        string str;
        cout << "Please enter your name\n";
        cin >> str;                            // #include <string>
        cout << "Hello, " << str << "!\n";
    }

如果你键入

    Eric

回应将是

    Hello, Eric!

按照默认方式,一个空白字符,例如空格符,将结束一次输入。因此,如果你键入

    Eric Bloodaxe

即使空格后的输入好像是York的那个超肥的国王,回答将仍然是

    Hello, Eric!

你可以用函数 getline() 读入一个完整的行。例如,

    int main()
    {
        string str;
        cout << "Please enter your name\n";
        getline(cin, str);
        cout << "Hello, " << str << "!\n";
    }

对于这个程序,输入

    Eric Bloodaxe

就能将产生所预期的输出

    Hello, Eric Bloodaxe!

这种标准字符串有着很好的性质,它可以自动扩展以存放你放进去的任意多的东西。所以,如果你送入了几百万个分号,这个程序也将送回你成页成页的分号---除非你的机器或者操作系统在此之前用完了某种关键性的资源。

🔚